#ifndef ASTM_H
#define ASTM_H

#include <QString>
#include <QStringList>

#define ASTM_VERSION_H 1
#define ASTM_VERSION_L 0

class ASTM
{
public:
    static const char ENQ = 0x05;    // 【ENQ】通知接收方，将开始发送数据
    static const char ACK = 0x06;    // 【ACK】表示接收到指令，并准备好接收数据
    static const char NAK = 0x15;    // 【NAK】表示接收到指令，并没有准备好接收数据
    static const char EOT = 0x04;    // 【EOT】通知接收方，发送结束
    static const char STX = 0x02;    // 【STX】（数据）起始帧头
    static const char CR  = 0x0D;    // 【CR】（数据）帧数据结束符-ASCII回车符
    static const char LF  = 0x0A;    // 【LF】（数据）ASCII换行符
    static const char ETB = 0x17;    // 【ETB】（数据）分帧发送的帧结束符
    static const char ETX = 0x03;    // 【ETX】（数据）帧结束符
    static const char FIELD  = '|';  // 【|】域分隔符
    static const char UNIT   = '^';  // 【^】组件分隔符
    static const char REPEAT = '\\'; // 【\】重复分隔符
    static const char ESCAPE = '&';  // 【&】转义字符

    enum RecordType {
        Header = 0,
        Patient,
        Order,
        Result,
        Comment,
        Request,
        Terminator,

        Max
    };

    ASTM();
    virtual ~ASTM(){}

    static QString version() {
        return QString("RL_V%1.%2").arg(ASTM_VERSION_H).arg(ASTM_VERSION_L);
    }

    static bool isNewVersion() {
        return ASTM_VERSION_H == 1 && ASTM_VERSION_L == 3;
    }

    static QString CRLF() {
        return QString(CR) + LF;
    }

    QString recordTypeSymbol(RecordType type) const;
    RecordType recordType(const QString &symbol) const;

    // 在首尾分别添加<STX>1和<ETX>、检验码、<CR><LF>
    static QByteArray dataToFrame(const QByteArray &date);
    static QByteArray dataFromeFrame(const QByteArray &frame);

    virtual QString buildRecord() const { return QString(); }
    virtual bool analyzeRecord(const QString &str) {
        Q_UNUSED(str);
        return false;
    }

private:
    QStringList recordTypeList{"H", "P", "O", "R", "C", "Q", "L"};
};

#endif // ASTM_H
